﻿using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using UricaoWeb.Datos.ConexionBD.Reportes_Graficos___Housekeeping___Limpieza;
using UricaoWeb.Datos.Excepciones.ReportesyLimpieza;

namespace UricaoWeb.LogicaDeNegocios.Reportes_Graficos___Housekeeping___Limpieza
{
    public class LimpiezaLogica
    {
        private static List<Parametro> _listaParametros;
        private static Limpieza _limpieza = new Limpieza();
        public static int hotel;
        public static string _mensajeFinal;




        #region Validaciones de la presentacion Limpieza

        ///<sumary>
        ///Metodo que se encarga de validar que los elementos queden sin informacion
        ///Parámetros:
        ///String campoNumeroHabitacion: dato de numero de habitacion 
        ///String campoFecha:  dato de fecha
        ///Retorno: 
        ///Bool: Devuelve true o false dependiendo del caso
        ///</sumary>
        private static bool ValidarElementosVacios(string campoNumeroHabitacion, string campoFecha)
        {
            if (campoNumeroHabitacion.Equals("") || campoFecha.Equals(""))
            {
                return true;
            }
            else
            {
                return false;
            }
        }

        ///<sumary>
        ///Metodo que se encarga de validar que la fecha actual no sea una fecha pasada
        ///Parámetros:
        ///DateTime fechaAsignada: dato fecha obtenido 
        ///Retorno: 
        ///Bool: Devuelve true o false dependiendo del caso 
        ///</sumary>
        private static bool ValidarFechasPasadas(DateTime fechaAsignada)
        {
            if (fechaAsignada.CompareTo(DateTime.Now) < 0)
            {
                return false;
            }
            else
            {
                return true;
            }
        }

        ///<sumary>
        ///Metodo que se encarga de validar que se haya seleccionado al menos un empleado
        ///en el checkBoxList en la ventana asignar personal 
        ///Parámetros:
        ///ListItemCollection itemsEmpleados: empleados obtenidos
        ///Retorno: 
        ///Bool: Devuelve true o false dependiendo del caso
        ///</sumary>
        private static bool ValidarSeleccionDeEmpleados(ListItemCollection itemsEmpleados)
        {
            for (int i = 0; i < itemsEmpleados.Count; i++)
            {
                if (itemsEmpleados[i].Selected)
                {
                    return false;
                }
            }
            return true;
        }

        ///<sumary>
        ///Metodo que se encarga de hacer el llamado de las validaciones de los campos
        ///Parámetros:
        ///TextBox tbNumHabitacion: componente para el numero de la habitacion 
        ///String fechayHoraLimpieza: fecha y hora de la limpieza 
        ///CheckBoxList cbListEmpleado: componente para listar a los empleados
        ///Label lmensajeError: componente para mostrar el mensaje de error
        ///Retorno: 
        ///Bool: Devuelve true o false dependiendo del caso
        ///</sumary>
        public bool ValidacionesAsignarP(TextBox tbNumHabitacion, string fechaYHoraLimpieza, CheckBoxList cbListEmpleados, Label lmensajeError)
        {
            if (ValidarElementosVacios(tbNumHabitacion.Text, fechaYHoraLimpieza) || ValidarSeleccionDeEmpleados(cbListEmpleados.Items))
            {
                MostrarMensajeDeError(lmensajeError, "Debe llenar todos los campos");
                return false;
            }
            else
            {
                if (!(ValidarFechasPasadas(Convert.ToDateTime(fechaYHoraLimpieza))))
                {
                    MostrarMensajeDeError(lmensajeError, "La hora o fecha deben ser mayores a la actual");
                    return false;
                }
                if (!(ValidarTexBox(tbNumHabitacion, lmensajeError)))
                {
                    return false;
                }
            }
            return true;
        }


        ///<sumary>
        ///Metodo que se encarga de validar el componente texBox
        ///Parámetros:
        ///TextBox tbNumHabitacion: componente para colocar el numero de la habitacion
        ///Label lmensajeError: componente para mostrar el mensaje de error
        ///Retorno: 
        ///Bool: Devuelve true o false dependiendo del caso
        ///</sumary>
        public bool ValidarTexBox(TextBox tbNumHabitacion, Label lmensajeError)
        {
            if (tbNumHabitacion.Text.Equals(""))
            {
                return false;
            }

            else if ((tbNumHabitacion.Text.Length < 3) || tbNumHabitacion.Text.Equals("000"))
            {
                MostrarMensajeDeError(lmensajeError, "El número de la habitación es incorrecto");
                return false;
            }
            return true;
        }

        ///<sumary>
        ///Metodo que se encarga de obtener la lista de empleados asignados 
        ///Parámetros:
        ///CheckBoxList cbListEmpleado: componente para listar a los empleados
        ///Label lmensajeError: componente para mostrar el mensaje de error
        ///Retorno: 
        ///List<int> _empleadosAsignados: listado obtenido
        ///</sumary> 
        public List<int> ListaEmpleadosAsignados(CheckBoxList cbListEmpleados, Label lMensajeError)
        {
            List<int> _empleadosAsignados;
            _empleadosAsignados = new List<int>();
            int _catidadSeleccionada = 0;
            int i = 0;
            while ((i < cbListEmpleados.Items.Count) && (_catidadSeleccionada <= 3))
            {
                if (cbListEmpleados.Items[i].Selected)
                {
                    _empleadosAsignados.Add(Convert.ToInt32(cbListEmpleados.Items[i].Value));
                    _catidadSeleccionada = _catidadSeleccionada + 1;
                }
                i++;
            }

            if (_catidadSeleccionada > 3)
            {
                MostrarMensajeDeError(lMensajeError, "Solo puede seleccionar hasta tres empleados");
                return null;
            }
            else
            {
                return _empleadosAsignados;
            }

        }


        ///<sumary>
        ///Metodo que se encarga de manejar los mensajes de error 
        ///Parámetros:
        ///Label lmensajeError: componente para mostrar el mensaje de error
        ///String mensaje: mensaje a mostrar 
        ///</sumary>
        public void MostrarMensajeDeError(Label mensajeError, string mensaje)
        {
            mensajeError.Text = "Error. ";
            mensajeError.Text = mensajeError.Text + mensaje;
            mensajeError.Visible = true;
        }

        #endregion


        #region Para cargar la pagina

        ///<sumary>
        ///Metodo que se encarga de llenar el checkBoxList de personal 
        ///en la ventana de asignar personal 
        ///Parámetros:
        ///CheckBoxList cbListEmpleado: componente para listar a los empleados
        ///</sumary>
        public static void LlenarListaCheckPersonal(CheckBoxList chListaDeEmpleados)
        {
            DataTable _temDataTableEmpleados;
            _temDataTableEmpleados = ConsultarEmpleadosLimpieza();
            _temDataTableEmpleados.DefaultView.Sort = "Empleado";
            chListaDeEmpleados.DataSource = _temDataTableEmpleados;
            chListaDeEmpleados.DataTextField = "Empleado";
            chListaDeEmpleados.DataValueField = "Id";
            chListaDeEmpleados.DataBind();
        }

        #endregion


        #region Lista de Parametros
        ///<sumary>
        ///Metodo que se encarga de realizar el llenado de la lista de parametros
        ///para la consulta de itinerario de limpieza por numero de habitacion 
        ///Parámetros:
        ///Retorno: 
        ///List<Parametro> list: listado de parametros 
        ///</sumary>
        private static List<Parametro> LlenarListaDeParametro(string numeroHabitacion)
        {
            List<Parametro> list = new List<Parametro>();

            int _numeroHabitacion = Convert.ToInt16(numeroHabitacion);

            Parametro _parametroNumeroHabitacion = new Parametro("@numeroHabitacion", _numeroHabitacion);
            Parametro _parametroHotel = new Parametro("@hotel", hotel);

            list.Add(_parametroNumeroHabitacion);
            list.Add(_parametroHotel);

            return list;
        }

        ///<sumary>
        ///Metodo que se encarga de realizar el llenado de la lista de parametros
        ///para la consulta de empleados de limpieza
        ///Retorno: 
        ///List<Parametro> list: listado de parametros
        ///</sumary>
        private static List<Parametro> LlenarListaDeParametroEmpleados()
        {
            List<Parametro> list = new List<Parametro>();

            Parametro _parametroHotel = new Parametro("@hotel", hotel);
            list.Add(_parametroHotel);

            return list;
        }



        ///<sumary>
        ///Metodo que se encarga de realizar el llenado de la lista de parametros
        ///para la consulta de habitaciones
        ///Retorno: 
        ///List<Parametro> list: listado de parametros
        ///</sumary>
        private static List<Parametro> LlenarListaDeParametroHabitaciones()
        {
            List<Parametro> list = new List<Parametro>();

            Parametro _parametroHotel = new Parametro("@hotel", hotel);
            list.Add(_parametroHotel);

            return list;
        }


        ///<sumary>
        ///Metodo que se encarga de realizar el llenado de la lista de parametros
        ///para la consulta de itinerario de limpieza dado un empleado  
        ///Parámetros:
        ///int idEmpleado: identificador del empleado 
        ///Retorno: 
        ///List<Parametro> list: listado de parametros 
        ///</sumary>
        private static List<Parametro> LlenarListaDeParametroItinerario(int idEmpleado)
        {
            List<Parametro> list = new List<Parametro>();

            Parametro _parametroIdEmpleado = new Parametro("@Empleado", idEmpleado);
            Parametro _parametroHotel = new Parametro("@hotel", hotel);

            list.Add(_parametroIdEmpleado);
            list.Add(_parametroHotel);

            return list;
        }


        ///<sumary>
        ///Metodo que se encarga de de agregar el itinerario de limpieza 
        ///Parámetros:
        ///String numeroHabitacion: numero de habitacion correspondiente
        ///String fechayHora: fecha y hora asiganada 
        ///int idEmpleado: identificador del empleado 
        ///Retorno: 
        ///List<Parametro> list: listado de parametros 
        ///</sumary>
        private static List<Parametro> LlenarListaDeParametroAsignacion(string numeroHabitacion, string fechaYHora, int idEmpleado)
        {
            List<Parametro> list = new List<Parametro>();

            Parametro _parametroFkEmpleado = new Parametro("@fkEmpleado", idEmpleado);
            Parametro _parametroHoraLimpieza = new Parametro("@horaLimpieza", Convert.ToDateTime(fechaYHora));
            Parametro _parametroNumeroHabitacion = new Parametro("@numeroHabitacion", Convert.ToInt16(numeroHabitacion));
            Parametro _parametroHotel = new Parametro("@fkhotel", hotel);

            list.Add(_parametroFkEmpleado);
            list.Add(_parametroHoraLimpieza);
            list.Add(_parametroNumeroHabitacion);
            list.Add(_parametroHotel);

            return list;
        }
        #endregion


        #region Logica para la BD


        ///<sumary>
        ///Metodo que se encarga de limpiar la variable de error
        ///</sumary>
        public static void LimpiarVariableError()
        {
            _mensajeFinal = "Disculpe en estos momentos no se puede realizar la operación";
        }


        ///<sumary>
        ///Metodo que se encarga de realizar la consulta del personal de limpieza por habitacion 
        ///Parámetros:
        ///String numHabitacion: numero de la habitacion
        ///Retorno: 
        ///Date Table: registros obtenido 
        ///</sumary>
        public DataTable ConsultarPersonalYHorario(string numeroHabitacion)
        {
            try
            {
                DataTable _tablaConsultaPersonalYHorario;
                _tablaConsultaPersonalYHorario = new DataTable();

                _listaParametros = LlenarListaDeParametro(numeroHabitacion);

                _tablaConsultaPersonalYHorario = _limpieza.ConsultasLimpieza("LimpiezaPorHabitacion", _listaParametros);

                return _tablaConsultaPersonalYHorario;
            }
            catch (ManejoBDException e)
            {
                _mensajeFinal = "Error " + e.Codigo + ": " + _mensajeFinal;
                return null;
            }
        }


        ///<sumary>
        ///Metodo que se encarga de realizar la consulta de empleados de limpieza 
        ///Retorno: 
        ///Date Table: registros obtenido
        ///</sumary>
        public static DataTable ConsultarEmpleadosLimpieza()
        {
            try
            {
                DataTable _tablaConsultaEmpleadosLimpieza;
                _tablaConsultaEmpleadosLimpieza = new DataTable();

                _listaParametros = LlenarListaDeParametroEmpleados();

                _tablaConsultaEmpleadosLimpieza = _limpieza.ConsultasLimpieza("ConsultarEmpleadosDeLimpieza", _listaParametros);

                return _tablaConsultaEmpleadosLimpieza;
            }
            catch (ManejoBDException e)
            {
                _mensajeFinal = "Error " + e.Codigo + ": " + _mensajeFinal;
                return null;
            }

        }


        ///<sumary>
        ///Metodo que se encarga de realizar la consulta del horario de limpieza por empleado 
        ///Parametro: 
        ///int idEmpleado: identificador de empleado 
        ///Retorno: 
        ///DataTable _tablaConsultarHabitacionYHorario: registros obtenidos
        ///Excepcion particular1:
        ///ManejoBDException: Atrapa los errores que pueden existir al realizar la consulta
        ///</sumary>
        public DataTable ConsultarHabitacionYHorario(int idEmpleado)
        {
            try
            {
                DataTable _tablaConsultaHabitacionYHorario;
                _tablaConsultaHabitacionYHorario = new DataTable();

                _listaParametros = LlenarListaDeParametroItinerario(idEmpleado);

                _tablaConsultaHabitacionYHorario = _limpieza.ConsultasLimpieza("ConsultarHorarioDeLimpiezaPorEmpleado", _listaParametros);

                return _tablaConsultaHabitacionYHorario;
            }
            catch (ManejoBDException e)
            {
                _mensajeFinal = "Error " + e.Codigo + ": " + _mensajeFinal;
                return null;
            }
        }


        ///<sumary>
        ///Metodo que sera usado para el procedimiento de agregar horario de limpieza 
        ///Parametro: 
        ///int idEmpleado: identificador de empleado 
        ///Retorno: 
        ///DataTable _tablaConsultarHabitacionYHorario: registros obtenidos
        ///Excepcion particular1:
        ///ManejoBDException: Atrapa los errores que pueden existir al realizar la consulta
        ///</sumary>
        public bool AsignarPersonal(string numeroHabitacion, string fechaYHora, List<int> _listaEmpleados)
        {
            bool completo = false;
            try
            {
                for (int i = 0; i < _listaEmpleados.Count; i++)
                {
                    List<Parametro> list = LlenarListaDeParametroAsignacion(numeroHabitacion, fechaYHora, _listaEmpleados[i]);

                    completo = _limpieza.AsignarLimpieza("AgregarHorarioLimpieza", list);
                }
                return completo;
            }
            catch (ManejoBDException e)
            {
                _mensajeFinal = "Error " + e.Codigo + ": " + _mensajeFinal;
                return false;
            }
        }


        ///<sumary>
        ///Metodo que se encarga de realizar la consulta las habitaciones existentes
        ///Retorno: 
        ///Date Table: registros obtenido
        ///</sumary>
        public bool ConsultarHabitacionesExistentes(int numHabitacion)
        {
            try
            {
                DataTable _tablaConsultaHabitaciones;
                _tablaConsultaHabitaciones = new DataTable();

                _listaParametros = LlenarListaDeParametroHabitaciones();

                _tablaConsultaHabitaciones = _limpieza.ConsultasHabitaciones("ConsultarHabitacionesExist", _listaParametros);

                int _cuentaFila = _tablaConsultaHabitaciones.Rows.Count;
                bool _existe = false;
                int num;

                foreach (DataRow row in _tablaConsultaHabitaciones.Rows)
                {
                    num = Convert.ToInt32(row["numeroHabitacion"].ToString());
                    if (num == numHabitacion)
                    {
                        _existe = true;
                        return _existe;
                    }

                }
                return _existe;
            }
            catch (ManejoBDException e)
            {
                _mensajeFinal = "Error " + e.Codigo + ": " + _mensajeFinal;
                return false;
            }

        }


        #endregion


        #region Modificaciones de dataTable
        ///<sumary>
        ///Metodo que formatea el número de habitacion al formato de tres digitos 
        ///Parámetros: 
        ///DataTable: _tableViejo: Corresponde a la tabla que se le cambiara a un
        ///nuevo formato el numero de habitacion
        ///Retorno: 
        ///DataTable: Tabla que contiene el nuevo formato de num habitacion
        ///Excepciones posibles: 
        ///Excepcion particular1: 
        ///</sumary>
        public DataTable FormatearNumHabitacion(DataTable _tableViejo)
        {
            DataTable _tablaNueva = new DataTable();
            _tablaNueva = CrearTablaDatosFormateada(_tablaNueva);
            string _formato = "";
            int _cuentaFila = _tableViejo.Rows.Count;

            for (int i = 0; i < _cuentaFila; i++)
            {
                _formato = _tableViejo.Rows[i]["Habitacion"].ToString();

                if (_formato.Length == 2)
                {
                    _formato = "0" + _formato;
                }
                if (_formato.Length == 1)
                {
                    _formato = "00" + _formato;
                }

                DataRow _fila = _tablaNueva.NewRow();
                _fila["Habitacion"] = _formato;
                _fila["Itinerario"] = _tableViejo.Rows[i]["Itinerario"].ToString();

                _tablaNueva.Rows.Add(_fila);

            }
            return _tablaNueva;
        }


        private DataTable CrearTablaDatosFormateada(DataTable _tabla)
        {
            _tabla.Columns.Add("Habitacion", typeof(string));
            _tabla.Columns.Add("Itinerario", typeof(string));
            return _tabla;
        }
        #endregion


    }
}